package com.rop.znyx.product.service.impl;


import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rop.znyx.common.constant.MqConst;
import com.rop.znyx.common.service.RabbitService;
import com.rop.znyx.enums.SkuType;
import com.rop.znyx.model.product.SkuAttrValue;
import com.rop.znyx.model.product.SkuImage;
import com.rop.znyx.model.product.SkuInfo;
import com.rop.znyx.model.product.SkuPoster;
import com.rop.znyx.product.mapper.SkuInfoMapper;
import com.rop.znyx.product.service.SkuAttrValueService;
import com.rop.znyx.product.service.SkuImageService;
import com.rop.znyx.product.service.SkuInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rop.znyx.product.service.SkuPosterService;
import com.rop.znyx.vo.product.SkuInfoQueryVo;
import com.rop.znyx.vo.product.SkuInfoVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * sku信息 服务实现类
 * </p>
 *
 * @author rop
 * @since 2023-06-24
 */

@Slf4j
@Service
@RequiredArgsConstructor
public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoMapper, SkuInfo> implements SkuInfoService {

    private final SkuAttrValueService skuAttrValueService;

    private final SkuImageService skuImageService;

    private final SkuPosterService skuPosterService;

    private final RabbitService rabbitService;

    /**
     * 获取sku分页列表
     */
    @Override

    public IPage<SkuInfo> selectByPage(Page<SkuInfo> pageParam, SkuInfoQueryVo skuInfoQueryVo) {
        // 查询条件
        Long categoryId = skuInfoQueryVo.getCategoryId();
        String skuType = skuInfoQueryVo.getSkuType();
        String keyword = skuInfoQueryVo.getKeyword();

        LambdaQueryWrapper<SkuInfo> queryWrapper = new LambdaQueryWrapper<>();
        if (ObjectUtil.isNotNull(categoryId)) {
            queryWrapper.eq(SkuInfo::getCategoryId, categoryId);
        }
        if (StringUtils.isNotBlank(skuType)) {
            queryWrapper.eq(SkuInfo::getSkuType, skuType);
        }
        if (StringUtils.isNotBlank(keyword)) {
            queryWrapper.like(SkuInfo::getSkuName, keyword);
        }

        return baseMapper.selectPage(pageParam, queryWrapper);
    }

    /**
     * 添加sku信息
     */
    @Override
    @Transactional
    public Boolean saveSkuInfo(SkuInfoVo skuInfoVo) {
        // 1.添加sku基本信息
        SkuInfo skuInfo = new SkuInfo();
        BeanUtils.copyProperties(skuInfoVo, skuInfo);
        baseMapper.insert(skuInfo);

        // 2.添加sku海报列表
        List<SkuPoster> skuPosterList = skuInfoVo.getSkuPosterList();
        if (CollUtil.isNotEmpty(skuPosterList)) {
            skuPosterList.forEach(s -> s.setSkuId(skuInfo.getId()));
            skuPosterService.saveBatch(skuPosterList);
        }

        // 3.添加sku属性值
        List<SkuAttrValue> skuAttrValueList = skuInfoVo.getSkuAttrValueList();
        if (CollUtil.isNotEmpty(skuAttrValueList)) {
            skuAttrValueList.forEach(s -> s.setSkuId(skuInfo.getId()));
            skuAttrValueService.saveBatch(skuAttrValueList);
        }

        // 4.添加sku图片
        List<SkuImage> skuImagesList = skuInfoVo.getSkuImagesList();
        if (CollUtil.isNotEmpty(skuImagesList)) {
            skuImagesList.forEach(s -> s.setSkuId(skuInfo.getId()));
            skuImageService.saveBatch(skuImagesList);
        }

        return true;
    }

    /**
     * 获取sku信息
     */
    @Override
    public SkuInfoVo getSkuInfoById(Long id) {
        // 获取sku基本信息
        return getSkuInfoVO(id);
    }

    /**
     * 修改sku信息
     */
    @Override
    @Transactional
    public Boolean updateSkuInfoById(SkuInfoVo skuInfoVo) {
        // skuId
        Long id = skuInfoVo.getId();
        // 更新sku信息
        this.updateById(skuInfoVo);

        // 删除sku海报
        skuPosterService.remove(new LambdaQueryWrapper<SkuPoster>().eq(SkuPoster::getSkuId, id));
        // 保存sku海报
        List<SkuPoster> skuPosterList = skuInfoVo.getSkuPosterList();
        if (CollUtil.isNotEmpty(skuPosterList)) {
            skuPosterList.forEach(sp -> sp.setSkuId(id));
            skuPosterService.saveBatch(skuPosterList);
        }

        // 删除sku图片
        skuImageService.remove(new LambdaQueryWrapper<SkuImage>().eq(SkuImage::getSkuId, id));
        // 保存sku图片
        List<SkuImage> skuImageList = skuInfoVo.getSkuImagesList();
        if (CollUtil.isNotEmpty(skuImageList)) {
            int sort = 1;
            skuImageList.forEach(si -> {
                si.setSkuId(id);
                si.setSort(sort);
            });
            skuImageService.saveBatch(skuImageList);
        }

        // 删除sku平台属性
        skuAttrValueService.remove(new LambdaQueryWrapper<SkuAttrValue>().eq(SkuAttrValue::getSkuId, id));
        // 保存sku平台属性
        List<SkuAttrValue> skuAttrValueList = skuInfoVo.getSkuAttrValueList();
        if (CollUtil.isNotEmpty(skuAttrValueList)) {
            int sort = 1;
            skuAttrValueList.forEach(sv -> {
                sv.setSkuId(id);
                sv.setSort(sort);
            });
            skuAttrValueService.saveBatch(skuAttrValueList);
        }

        return true;
    }

    /**
     * 商品审核
     */
    @Override
    @Transactional
    public boolean check(Long skuId, Integer status) {
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId(skuId);
        skuInfo.setCheckStatus(status);

        // 更新
        return this.updateById(skuInfo);
    }

    /**
     * 商品上架/下架
     */
    @Override
    @Transactional
    public boolean publish(Long skuId, Integer status) {
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId(skuId);

        // 增加mq，通知es进行修改
        boolean flag;

        if (status == 1) {
            skuInfo.setPublishStatus(1);

            // 商品上架，发送消息，同步es
            flag = rabbitService.sendMessage(MqConst.EXCHANGE_GOODS_DIRECT, MqConst.ROUTING_GOODS_UPPER, skuId);
        } else {
            skuInfo.setPublishStatus(0);

            // 商品下架，发送消息，同步es
            flag = rabbitService.sendMessage(MqConst.EXCHANGE_GOODS_DIRECT, MqConst.ROUTING_GOODS_LOWER, skuId);
        }

        if (Boolean.FALSE.equals(flag)) {
            return Boolean.FALSE;
        }

        // 更新
        return this.updateById(skuInfo);
    }

    /**
     * 是否新人专享
     */
    @Override
    @Transactional
    public boolean isNewPerson(Long skuId, Integer status) {
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId(skuId);
        skuInfo.setIsNewPerson(status);

        // 更新
        return this.updateById(skuInfo);
    }

    @Override
    public List<SkuInfo> getSkuInfoByIds(List<Long> skuIds) {
        return CollUtil.isNotEmpty(skuIds) ? this.listByIds(skuIds) : new ArrayList<>();
    }

    /**
     * 根据关键字获取sku列表
     */
    @Override
    public List<SkuInfo> findSkuInfoByKeyword(String keyword) {
        LambdaQueryWrapper<SkuInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(SkuInfo::getSkuName, keyword);
        return baseMapper.selectList(queryWrapper);
    }

    @Override
    @Transactional
    public void updateSkuType(List<Long> skuIdList, SkuType skuType) {
        List<SkuInfo> entityList = new ArrayList<>();
        SkuInfo skuInfo = new SkuInfo();

        skuIdList.forEach(id -> {
            skuInfo.setId(id);
            skuInfo.setSkuType(skuType.getCode());
        });

        this.updateBatchById(entityList);
    }

    private SkuInfoVo getSkuInfoVO(Long id) {
        SkuInfoVo skuInfoVo = new SkuInfoVo();

        SkuInfo skuInfo = baseMapper.selectById(id);

        // skuImagesService
        List<SkuImage> skuImageList = skuImageService.findBySkuId(id);
        //  skuPosterService
        List<SkuPoster> skuPosterList = skuPosterService.findBySkuId(id);
        //  skuAttrValueService
        List<SkuAttrValue> skuAttrValueList = skuAttrValueService.findBySkuId(id);

        BeanUtils.copyProperties(skuInfo, skuInfoVo);
        BeanUtils.copyProperties(skuImageList, skuInfoVo);
        BeanUtils.copyProperties(skuPosterList, skuInfoVo);
        BeanUtils.copyProperties(skuAttrValueList, skuInfoVo);

        return skuInfoVo;
    }
}
